package com.xiaoshuidi.cloud.module.bpm.service.swo;


import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.framework.security.core.LoginUser;
import com.xiaoshuidi.cloud.module.bpm.controller.admin.swo.vo.*;
import com.xiaoshuidi.cloud.module.bpm.controller.admin.sworecord.vo.GetSwoTicketRespVO;
import com.xiaoshuidi.cloud.module.bpm.controller.app.swo.vo.AppSwoTicketCreateReqVO;
import com.xiaoshuidi.cloud.module.bpm.controller.app.swo.vo.AppSwoTicketRespVO;
import com.xiaoshuidi.cloud.module.bpm.controller.app.swo.vo.SwoTicketAppraiseReqVO;
import com.xiaoshuidi.cloud.module.bpm.dal.dataobject.swo.SwoTicketDO;

import java.time.LocalDate;
import java.util.*;
import javax.validation.*;
import javax.validation.constraints.NotNull;


/**
 * wo 服务工单申请 Service 接口
 *
 * @author 芋道源码
 */
public interface SwoTicketService {



    int getStatisticsOfUNAssignStatus();


    Map getStatisticsForProcessStatus();




    /**
     * 创建wo 服务工单申请
     * @param createReqVO       创建信息
     * @return 编号
     */
    Long createSwoTicket(LoginUser loginUser, @Valid SwoTicketCreateReqVO createReqVO);


    /**
     * 更新wo 服务工单申请
     *
     * @param loginUser
     * @param updateReqVO 更新信息
     */
    void updateSwoTicket(LoginUser loginUser, @Valid SwoTicketUpdateReqVO updateReqVO);

    /**
     * 删除wo 服务工单申请
     *
     * @param id 编号
     */
    void deleteSwoTicket(Long id);

    /**
     * 获得wo 服务工单申请
     *
     * @param id 编号
     * @return wo 服务工单申请
     */
    GetSwoTicketRespVO getSwoTicket(Long id);

    /**
     * 获得wo 服务工单申请列表
     *
     * @param ids 编号
     * @return wo 服务工单申请列表
     */
    List<SwoTicketDO> getSwoTicketList(Collection<Long> ids);

    /**
     * 获得wo 服务工单申请分页
     *
     * @param pageReqVO 分页查询
     * @return wo 服务工单申请分页
     */
    PageResult<SwoTicketRespVO> getSwoTicketPage(SwoTicketPageReqVO pageReqVO);

    /**
     * 获得wo 服务工单申请列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return wo 服务工单申请列表
     */
    List<SwoTicketDO> getSwoTicketList(SwoTicketExportReqVO exportReqVO);

    /**
     * 服务工单 - 指派
     * @param userId
     * @param swoAssignmentReqVO
     * @return
     */
    Long assignment(Long userId, SwoAssignmentReqVO swoAssignmentReqVO);

    /**
     * 结束wo 服务工单申请
     *
     * @param userId
     * @param stopSwoTicketReqVO
     */
    Boolean stop(@NotNull Long userId, @Valid StopSwoTicketReqVO stopSwoTicketReqVO);

    /**
     * 服务工单 - 上传附件
     * @param uploadAnnex
     * @return
     */
    Boolean uploadAnnex(@Valid UploadAnnex uploadAnnex);

    /**
     * 服务工单 - 催单
     * @param id
     * @return
     */
    Boolean reminders(Long id);

    /**
     * 分页状态数量统计
     * @return
     */
    SwoTicketStatusCountRespVO statusCount(Integer serviceType);

    /**
     * 租客端 - 申请服务工单
     * @param loginUser
     * @param appSwoTicketCreateReqVO
     * @return
     */
    Long appCreateSwoTicket(LoginUser loginUser, AppSwoTicketCreateReqVO appSwoTicketCreateReqVO);

    /**
     * 租客端 - 服务工单分页
     * @param customerMobile
     * @param pageNo
     * @param pageSize
     * @return
     */
    PageResult<AppSwoTicketRespVO> appGetSwoTicketPage(String customerMobile, Integer pageNo, Integer pageSize);

    /**
     * 租客端 - 取消服务工单
     *
     * @param loginUser
     * @param id
     * @return
     */
    Boolean appCancelSwoTicket(LoginUser loginUser, Long id);

    /**
     * 租客端 - 服务工单评价
     * @param swoTicketAppraiseReqVO
     * @return
     */
    Boolean swoTicketAppraise(SwoTicketAppraiseReqVO swoTicketAppraiseReqVO);

    Long getTotalNumber();

    /**
     * 未处理完成的紧急报修的工单数量
     * @return
     */
    Long urgentRepariNum();

    /**
     * 服务工单受理
     * @param swoAcceptanceReqVO
     */
    Boolean acceptance(SwoAcceptanceReqVO swoAcceptanceReqVO);

    /**
     * 回显信息
     * @param swoTicketId
     * @return
     */
    SwoAcceptanceReqVO getAcceptanceInfo(Long swoTicketId);

    /**
     * 小程序服务工单分页
     *
     * @param loginUserId
     * @param pageVO
     * @return
     */
    PageResult<SwoTicketRespVO> getSwoTicketPageList(Long loginUserId, SwoTicketPageListReqVO pageVO);

    /**
     * 小程序服务工单标记
     * @param swoMarkerReqVO
     */
    Boolean setMarker(SwoMarkerReqVO swoMarkerReqVO,Long userId);

    /**
     * 生成账单
     * @param swoBillReqVO
     * @return
     */
    Boolean addBill(SwoBillReqVO swoBillReqVO);

    void updateMember(Long userId, Long oldUserId, String oldMobile, String mobile, String userName);

    /**
     * 关闭服务工单申请
     * @param loginUser
     * @param shutdownSwoTicketReqVO
     * @return
     */
    Boolean shutdown(LoginUser loginUser, ShutdownSwoTicketReqVO shutdownSwoTicketReqVO);
    /**
     * 工单数据汇总
     * @param startTime
     * @param endTime
     * @param tenantId
     * @return
     */
    PageResult<SwoTicketSummaryCountRespVO> getSummaryList(LocalDate startTime, LocalDate endTime, Long tenantId, Integer pageSize, Integer pageNum);

    SwoTickerExportResp getSummaryListExport(LocalDate startTime, LocalDate endTime, Long tenantId, Integer pageSize, Integer pageNum);

    /**
     * 获得维修完成率
     * @param maintenanceRateReqVO
     * @return
     */
    MaintenanceRateRespVO maintenanceRate(MaintenanceRateReqVO maintenanceRateReqVO);

    /**
     * 统计是否有偿维修
     * @param maintenanceRateReqVO
     * @return
     */
    NeedPayRateRespVO isNeedPayRate(MaintenanceRateReqVO maintenanceRateReqVO);

    /**
     * 统计评价率
     * @param maintenanceRateReqVO
     * @return
     */
    EvaluateRateRespVO evaluateRate(MaintenanceRateReqVO maintenanceRateReqVO);

    /**
     * 统计维修及时率
     * @param maintenanceRateReqVO
     * @return
     */
    TimelyMaintenanceRateRespVO timelyMaintenanceRate(MaintenanceRateReqVO maintenanceRateReqVO);
}
